{
 "cells": [
  {
   "cell_type": "code",
   "id": "initial_id",
   "metadata": {
    "collapsed": true,
    "ExecuteTime": {
     "end_time": "2025-03-05T13:18:59.859566Z",
     "start_time": "2025-03-05T13:18:55.717484Z"
    }
   },
   "source": [
    "import matplotlib as mpl\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "import numpy as np\n",
    "import sklearn\n",
    "import pandas as pd\n",
    "import os\n",
    "import sys\n",
    "import time\n",
    "from tqdm.auto import tqdm\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.nn.functional as F\n",
    "\n",
    "print(sys.version_info)\n",
    "for module in mpl, np, pd, sklearn, torch:\n",
    "    print(module.__name__, module.__version__)\n",
    "\n",
    "device = torch.device(\"cuda:0\") if torch.cuda.is_available() else torch.device(\"cpu\")\n",
    "print(device)\n",
    "\n",
    "seed = 42\n"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "sys.version_info(major=3, minor=12, micro=3, releaselevel='final', serial=0)\n",
      "matplotlib 3.10.0\n",
      "numpy 1.26.4\n",
      "pandas 2.2.3\n",
      "sklearn 1.6.0\n",
      "torch 2.3.1+cu121\n",
      "cuda:0\n"
     ]
    }
   ],
   "execution_count": 1
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "# 数据准备",
   "id": "64c8ce195155f07c"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T01:34:27.173958Z",
     "start_time": "2025-03-05T01:34:16.032203Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from tensorflow import keras\n",
    "\n",
    "# karas中的数据集imbd，电影评论分类\n",
    "imdb = keras.datasets.imdb\n",
    "\n",
    "# 载入数据\n",
    "# 词典大小，仅保留训练数据中前10000个最经常出现的单词，低频单词被舍弃\n",
    "vocab_size = 10000\n",
    "\n",
    "# 序号从3开始，0,1,2,3空出来做别的事,作为特殊字符处理\n",
    "index_from = 3\n",
    "\n",
    "# 取出的词表是从1开始的，需要做处理\n",
    "(train_data, train_labels), (test_data, test_labels) = imdb.load_data(\n",
    "    num_words=vocab_size, index_from=index_from)"
   ],
   "id": "5cb0a620d7e316bc",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/imdb.npz\n",
      "\u001B[1m17464789/17464789\u001B[0m \u001B[32m━━━━━━━━━━━━━━━━━━━━\u001B[0m\u001B[37m\u001B[0m \u001B[1m9s\u001B[0m 0us/step\n"
     ]
    }
   ],
   "execution_count": 3
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T01:35:20.529108Z",
     "start_time": "2025-03-05T01:35:20.525763Z"
    }
   },
   "cell_type": "code",
   "source": [
    "print(\"tpye of train_data:\", type(train_data))\n",
    "print(\"shape of train_data:\", train_data.shape)  # #每个样本是一段话，每个单词用一个数字表示\n",
    "print(\"type of train_labels:\", type(train_labels))\n",
    "print(\"shape of train_labels:\", train_labels.shape)"
   ],
   "id": "4d37f7367919f810",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tpye of train_data: <class 'numpy.ndarray'>\n",
      "shape of train_data: (25000,)\n",
      "type of train_labels: <class 'numpy.ndarray'>\n",
      "shape of train_labels: (25000,)\n"
     ]
    }
   ],
   "execution_count": 4
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T01:37:16.167160Z",
     "start_time": "2025-03-05T01:37:16.163159Z"
    }
   },
   "cell_type": "code",
   "source": [
    "print(\"type of train_data[0]:\", type(train_data[0]))\n",
    "print(\"train_data[0]:\", train_data[0])\n",
    "print(\"length of train_data[0]:\", len(train_data[0]))"
   ],
   "id": "c9674e46698b4c48",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "type of train_data[0]: <class 'list'>\n",
      "train_data[0]: [1, 14, 22, 16, 43, 530, 973, 1622, 1385, 65, 458, 4468, 66, 3941, 4, 173, 36, 256, 5, 25, 100, 43, 838, 112, 50, 670, 2, 9, 35, 480, 284, 5, 150, 4, 172, 112, 167, 2, 336, 385, 39, 4, 172, 4536, 1111, 17, 546, 38, 13, 447, 4, 192, 50, 16, 6, 147, 2025, 19, 14, 22, 4, 1920, 4613, 469, 4, 22, 71, 87, 12, 16, 43, 530, 38, 76, 15, 13, 1247, 4, 22, 17, 515, 17, 12, 16, 626, 18, 2, 5, 62, 386, 12, 8, 316, 8, 106, 5, 4, 2223, 5244, 16, 480, 66, 3785, 33, 4, 130, 12, 16, 38, 619, 5, 25, 124, 51, 36, 135, 48, 25, 1415, 33, 6, 22, 12, 215, 28, 77, 52, 5, 14, 407, 16, 82, 2, 8, 4, 107, 117, 5952, 15, 256, 4, 2, 7, 3766, 5, 723, 36, 71, 43, 530, 476, 26, 400, 317, 46, 7, 4, 2, 1029, 13, 104, 88, 4, 381, 15, 297, 98, 32, 2071, 56, 26, 141, 6, 194, 7486, 18, 4, 226, 22, 21, 134, 476, 26, 480, 5, 144, 30, 5535, 18, 51, 36, 28, 224, 92, 25, 104, 4, 226, 65, 16, 38, 1334, 88, 12, 16, 283, 5, 16, 4472, 113, 103, 32, 15, 16, 5345, 19, 178, 32]\n",
      "length of train_data[0]: 218\n"
     ]
    }
   ],
   "execution_count": 6
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T01:38:29.786201Z",
     "start_time": "2025-03-05T01:38:27.561149Z"
    }
   },
   "cell_type": "code",
   "source": [
    "#载入词表，看下词表长度，词表就像英语字典\n",
    "# 加载IMDB词典，将其转换为字典形式\n",
    "word_index = imdb.get_word_index()\n",
    "print(len(word_index))\n",
    "print(type(word_index))\n",
    "# 词表有八万多单词，只加载前10000个单词"
   ],
   "id": "94faad64b6e686f2",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/imdb_word_index.json\n",
      "\u001B[1m1641221/1641221\u001B[0m \u001B[32m━━━━━━━━━━━━━━━━━━━━\u001B[0m\u001B[37m\u001B[0m \u001B[1m2s\u001B[0m 1us/step\n",
      "88584\n",
      "<class 'dict'>\n"
     ]
    }
   ],
   "execution_count": 7
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "# 构造 word2idx 和 idx2word",
   "id": "6611213d304d74bc"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T01:41:53.382752Z",
     "start_time": "2025-03-05T01:41:53.363899Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 词典，单词到id的映射，作用：将文本转换为数字序列\n",
    "word2idx = {word: (idx + 3) for word, idx in word_index.items()}\n",
    "word2idx.update({\n",
    "    \"[PAD]\": 0,  # 填充token\n",
    "    \"[BOS]\": 1,  # 句子开始\n",
    "    \"[UNK]\": 2,  # 未知token\n",
    "    \"[EOS]\": 3,  # 句子结束\n",
    "})\n",
    "\n",
    "# 反向词典，id变为单词，作用：将模型输出的id转换为单词\n",
    "idx2word = {idx: word for word, idx in word2idx.items()}"
   ],
   "id": "81788f9ba8436a04",
   "outputs": [],
   "execution_count": 8
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T01:44:36.516244Z",
     "start_time": "2025-03-05T01:44:36.512699Z"
    }
   },
   "cell_type": "code",
   "source": [
    "print(\"单词 world 对应的 id:\", word2idx[\"world\"])\n",
    "print(\"id 128 对应的单词:\", idx2word[128])"
   ],
   "id": "b71270628efd79f8",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "单词 world 对应的 id: 182\n",
      "id 128 对应的单词: better\n"
     ]
    }
   ],
   "execution_count": 9
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T01:47:00.531064Z",
     "start_time": "2025-03-05T01:46:59.984357Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 构造句子长度统计图\n",
    "length_collect = {}\n",
    "#统计样本中每个长度出现的次数\n",
    "for text in train_data:\n",
    "    # 单个句子的长度\n",
    "    length = len(text)\n",
    "\n",
    "    # 统计长度的频率\n",
    "    length_collect[length] = length_collect.get(length, 0) + 1\n",
    "\n",
    "MAX_LENGTH = 500\n",
    "# 长度分布图\n",
    "plt.bar(length_collect.keys(), length_collect.values())\n",
    "plt.axvline(MAX_LENGTH, label=\"max length\", c=\"gray\", ls=\":\")\n",
    "plt.legend()\n",
    "plt.show()"
   ],
   "id": "8ee327d80b847300",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ],
      "image/png": "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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 11
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T01:48:20.358650Z",
     "start_time": "2025-03-05T01:48:20.254807Z"
    }
   },
   "cell_type": "code",
   "source": [
    "#对句子长度画直方图，观察长度分布\n",
    "length_list = [len(text) for text in train_data]\n",
    "# .hist()函数绘制直方图\n",
    "plt.hist(length_list, bins=50)\n",
    "plt.xlabel(\"length\")\n",
    "plt.ylabel(\"frequency\")\n",
    "plt.axvline(500, label=\"max length\", c=\"gray\", ls=\":\")\n",
    "plt.legend()\n",
    "plt.show()"
   ],
   "id": "f06835d1003463f6",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ],
      "image/png": "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wJr0tNts9erVdjNr2bKle4xGobp429KlS+25Puobx3nDKA1yEhMTZePGje4xwedwjnHOcbalHvQcwRuyJu3j135n3YL7+wF4n34o1i04k7HewPW11GMKw3HshUj9IU3PGfya8z20xUR99NFHFrzpOCJtFNCeD20hCu7KUho8/Pzzz1avLVu2pKtOR44ckbp169q5gzc9X6dOnc5Zd6eeFysjz302UTPKVCNZXaBPB2o5qxfrG06b0oJp8KP7nGOCgyFnv7PvXMdokKORtQ72Sk37hrVJElmf/iP7+9//7pYBICvT8Tw6vujhhx92XwtutXFo44I2GGjgpN1v2jCgPSRpUadOHes203G5BQsWvKB66mBvHc/7448/WnCltNXpzz//PCPwiZaUKFHTQqTdYzfffLOUKVMmKppZtcvO2XS0PbImberWvmndmHYPIKvTcUWrVq2ycbDaYvPkk0+mGIzsdKlpL4iOq9UxRjobTB9TtyKdTefOnW0ck84s00HVOhZXxw49+uijsnv37jSdQ3t0NAjT2W46YFwDIy1rI0Rwy5p2jenYIG28SB0sZbaouEPogC8dB6QDwBx6A9NfnrYaBdNZZrrPOSb1rDPn+fmO0ag3VOuQ0tlouj94AwAg0rTFWycXdejQwQYr64Dr4NYiHcyss63HjRsnZcuWtde0/Pvvv1vwlBb58uWTb775xoao6PfSliVtadIxROm5H7733nvWI9OsWTObWq8tVTouSAeOO3R8r06o0rpee+21EkkxgSgYWKEDoN98801riXG6NbRlRgddT5kyxabbO4O0NOrUyFcHxelAMR3ZrjPUtGlP6bQ+fTNo/6kGNjrAWqdXOgO9lPaBHjhwQGbPnp2m+mn3muZB0DpFc3CUlmn1O0a3ET/Rpljnd6/Nxxfazw8gOulNWlswdPJM8I0W0Wf37t0W+GgDSIsWLTLlPZCe+3fEB1XoICmdPdatW7cUYzz0B9CINC4uzpJC6Q+is4QaNWpkwZDS/AyahVin440ZM8aa3HT6ouYu0mBI9erVy0bZDx482PpUFyxYYNMTZ80iJ49fAiLNxaH0vUJABACZY8GCBTZAWz+MasOF3oe1i0xbjKJRxAMijRR16mCohFE6NV7HfWgLkc780tlh2vTn0JubJmzSRFYaKOXPn98Cq5EjR7rHaMSowY/mNNJkWprQSnMhMOXeH/T9o33uThkAkDmSk5MtaeS2bdusq0wHg2vSyGhNfxIVXWbRji4zAIhOdJkhKUxdZnxkBgBkeXy2969AmH73BEQAgCzL6X4JXq8M/nLi/9IJXOwY0YiPIQIyug9bl29xBthHa981gAujN0FN4Oss66BTxoPz3MDbTp8+bYvs6u/9YpPvEhDB802pmmLBKQPwHifvXEavdYXopBNmNGfSxQbCBETwNP3EoOv8OGUA3qM3Ql38U/PRaasw/CVXrlxhmUXMHQK++OQAwB/dZ+Qaw4ViUDUAAPA9Wojg+QF3P/30k5V1PR6SMwIAQuHuAE87efKkfPLJJ7ZpGQCAUGghgucHW5YvX94tAwAQCgERPE3zDnXv3j3S1QAARDm6zAAAgO8REAEAAN+jywyepkna3nnnHSv36NGDpTsAACEREMHTdLmOffv2uWUAAEIhIIKn6XId9913n1sGACAU7hDwNE3EWKlSpUhXAwAQ5RhUDQAAfI8WInh+6Y6tW7dauXLlyizdAQAIibsDPE2X65gyZYptLN0BADgbWojgabpcR5kyZdwyAAChEBDB0zTvUM+ePSNdDQBAlKPLDAAA+B4BEQAA8D26zOD5pTvef/99K3fp0oWlOwAAIREQwdN0uY5du3a5ZQAAQiEggqfpch0dOnRwywAAhMIdAp6miRirVq0a6WoAAKIcg6oBAIDv0UIEzy/dsXPnTiuXK1eOpTsAACFxd4Cn6XIdkyZNso2lOwAAZ0MLETxNl+soXry4WwYAIBQCInia5h16+OGHI10NAECUo8sMAAD4HgERAADwPbrM4PmlOz766CMrd+zYkaU7AAAhERDB03S5jm3btrllAABCISCCp+lyHe3atXPLAACEwh0CnqaJGGvVqhXpagAAolzEB1X/97//lfvuu0+KFi0qefPmlZo1a8qqVavc/drNMXz4cCldurTtb9mypWzZsiXFOQ4cOCCdO3eWggULSuHChaVHjx5y5MiRFMesW7dOmjZtKnny5JGyZcvKmDFjMu1nBAAA0S2iAdGff/4pjRs3toGuX331lWzatElefPFFufTSS91jNHD517/+JePHj5fly5dL/vz5JTY2VpKSktxjNBjauHGjzJ07V2bOnCnffPONPPTQQ+7+xMREadWqlZQvX15Wr14tzz//vDz99NPy1ltvZfrPjMxfukODbt20DABAKDGBCI40HTp0qCxZskS+/fbbkPu1amXKlJEBAwbIwIED7bVDhw5JyZIlZeLEiTZr6KeffpLq1avLypUrpV69enbM7Nmz5ZZbbpHdu3fb17/xxhvy+OOPy969eyVXrlzu954xY4Zs3rz5jO97/Phx24IDKm1V0u+trVDRqsLQWec9ZsfoNuInJ06ckFGjRll52LBh7u8fAOB9iYmJUqhQoTTdvyPaQvT5559bEHP33XdLiRIl5Nprr5V///vf7v7t27dbEKPdZA79wRo0aCBLly615/qo3WROMKT0eB07oi1KzjHNmjVLcTPUVqb4+HhrpUpNb6D6fZxNgyFkTbpch/N7ZOkOAEBUBkQ6HVpbb6688kqZM2eO9O7dWx599FFbiFNpMKS0RSiYPnf26aMGU8F0NlGRIkVSHBPqHMHfI5i2JGg06Wy7du0K68+NzKPdsf369bONHEQAgKicZaZjOrRl55///Kc91xaiDRs22Hihbt26RaxeuXPntg0AAPhDRFuIdOaYjv8JVq1aNdm5c6eVS5UqZY/79u1LcYw+d/bpY0JCQor9J0+etJlnwceEOkfw9wAAAP4V0YBIZ5jpOJ5gP//8s80GUxUrVrSAZf78+SkGSOnYoEaNGtlzfTx48KDNHnMsWLDAWp90rJFzjM4802UcHDojrUqVKilmtMF7NDjWpTt00zIAAFEXEPXv31+WLVtmXWZbt26VDz/80KbC9+nTx/brIFgd+/Hss8/aAOz169dL165dbeZY27Zt3Ral1q1bS8+ePWXFihU2a61v3742A02PU506dbIB1ZqfSKfnf/zxxzJ27FiJi4uL5I+PTKCBsQbdujHtHgAQlWOI6tevL9OnT7dBzCNHjrQWoVdeecXyCjkGDx4sf/31l+UV0pagJk2a2LR6TbDomDx5sgVBLVq0sNll7du3t9xFDp1h9PXXX1ugVbduXSlWrJglewzOVQRvyp49u9x6661uGQCAqMtD5MU8BpFEHiIAALJgHiIAAIBowOKu8DRtAN2/f7+VixcvTnJGAEBItBDB03RmoSb/1C14liEAAMFoIYLn5cuXL9JVAABEOQIieJqmWxg0aFCkqwEAiHJ0mQEAAN8jIAIAAL5Hlxk8TZfr0Czn6vbbb5ccOXjLAwDORAsRPE2X69AlX3Rj6Q4AwNnwcRmepst1xMbGumUAAEIhIIKnaRDUsGHDSFcDABDl6DIDAAC+RwsRPL90hy7qp3SBP5buAACEQgsRPE2X6xg7dqxtLN0BADgbWojgeTlz5ox0FQAAUY6ACJ5fuuMf//hHpKsBAIhydJkBAADfIyACAAC+R5cZPL90x5dffmnlW265haU7AAAh0UIET9PlOn788UfbWLoDAHA2fFyG5zNVN2/e3C0DABAKARE8TYOgZs2aRboaAIAoR5cZAADwPVqI4PmlO44ePWrlfPnysXQHACAkWojgabpcxwsvvGAbS3cAAM6GgAgAAPgeXWbw/NIdTz31VKSrAQCIcrQQAQAA3yMgAgAAvkeXGTy/dMe8efOs3LJlS5buAACERAsRPE2X61i+fLltLN0BADgbPi7D85mqmzRp4pYBAAiFgAiepkFQixYtIl0NAECUo8sMAAD4Hi1E8PzSHU6G6pw5c7J0BwAgJFqI4GkaDI0aNco2lu4AAJwNAREAAPA9uszgadpNNmzYMLcMAEDUtRA9/fTTNqYjeKtataq7PykpSfr06SNFixaVAgUKSPv27WXfvn0pzrFz505p06aN5MuXT0qUKCGDBg2yZHzBFi1aJHXq1JHcuXNL5cqVZeLEiZn2MyKy9D2l65npxvghAEDUdpldffXVsmfPHnf77rvv3H39+/eXL774QqZNmyaLFy+W3377Te688053/6lTpywYOnHihHz//fcyadIkC3aGDx/uHrN9+3Y7pnnz5rJmzRrp16+fPPjggzJnzpxM/1kBAEB0iniXmS6lUKpUqTNeP3TokLzzzjvy4Ycfyk033WSvTZgwQapVqybLli2Thg0bytdffy2bNm2ypRlKliwptWvXlmeeeUaGDBlirU/aKjB+/HipWLGivPjii3YO/XoNul5++WWJjY3N9J8XmUuDZm0hVDfeeCPJGQEA0dlCtGXLFilTpoxcccUV0rlzZ+sCU6tXr7ZZQbr+lEO708qVKydLly615/pYs2ZNC4YcGuQkJibKxo0b3WOCz+Ec45wjlOPHj9s5gjdk3YBIA2DdtAwAQNQFRA0aNLAurtmzZ8sbb7xh3VtNmzaVw4cPy969e62Fp3Dhwim+RoMf3af0MTgYcvY7+851jAY5x44dC1kvnaJdqFAhdytbtmxYf25knmzZstn7TDctAwAQdV1mN998s1uuVauW3bTKly8vU6dOlbx580as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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 12
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "# Tokenizer",
   "id": "21e79938cff78ccf"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T02:29:22.627408Z",
     "start_time": "2025-03-05T02:29:22.621673Z"
    }
   },
   "cell_type": "code",
   "source": [
    "class Tokenizer:\n",
    "\n",
    "    def __init__(self, word2idx, idx2word, max_length=500, pad_idx=0, bos_idx=1, eos_idx=3, unk_idx=2):\n",
    "        self.word2idx = word2idx  #词表,单词到id\n",
    "        self.idx2word = idx2word  #词表，id到单词\n",
    "        self.max_length = max_length\n",
    "        self.pad_idx = pad_idx  #填充\n",
    "        self.bos_idx = bos_idx  #开始\n",
    "        self.eos_idx = eos_idx  #结束\n",
    "        self.unk_idx = unk_idx  #未知，未出现在最高频词表中的词\n",
    "\n",
    "    def encode(self, text_list):\n",
    "        \"\"\"\n",
    "        将文本列表转化为索引列表\n",
    "        :param text_list:当前批次的文本列表\n",
    "        :return:\n",
    "        \"\"\"\n",
    "        # 最大长度，句子长度小于500，取句子长度，大于500，取500，一个批次内的最大长度\n",
    "        max_length = min(self.max_length, 2 + max([len(text) for text in text_list]))\n",
    "        indices = []\n",
    "        for text in text_list:\n",
    "            # 单词转化为id，未知的词用unk_idx代替\n",
    "            index = [self.word2idx.get(word, self.unk_idx) for word in text]\n",
    "\n",
    "            # 添加开始和结束\n",
    "            index = [self.bos_idx] + index + [self.eos_idx]\n",
    "\n",
    "            if len(index) < max_length:\n",
    "                # 填充0\n",
    "                index = index + [self.pad_idx] * (max_length - len(index))\n",
    "            else:\n",
    "                # 如果句子长度大于500，就截断\n",
    "                index = index[:max_length - 1]\n",
    "                index = index + [self.eos_idx]\n",
    "            indices.append(index)\n",
    "        return torch.tensor(indices)  #二维列表转化为tensor\n",
    "\n",
    "    def decode(self, indices_list, remove_bos=True, remove_eos=True, remove_pad=True, split=False):\n",
    "        \"\"\"\n",
    "        将索引列表转化为文本列表\n",
    "        :param indices_list:某批次的索引列表\n",
    "        :param remove_bos:移除开始符\n",
    "        :param remove_eos:移除结束符\n",
    "        :param remove_pad:移除填充符\n",
    "        :param split:分词\n",
    "        :return:\n",
    "        \"\"\"\n",
    "        # 生成文本列表\n",
    "        text_list = []\n",
    "        for indices in indices_list:\n",
    "            # 单词列表\n",
    "            text = []\n",
    "\n",
    "            # 循环遍历索引列表\n",
    "            for index in indices:\n",
    "\n",
    "                # id转化为单词\n",
    "                word = self.idx2word.get(index, \"[UNK]\")\n",
    "                # 移除开始符\n",
    "                if remove_bos and word == \"[BOS]\":\n",
    "                    continue\n",
    "                # 移除结束符\n",
    "                if remove_eos and word == \"[EOS]\":\n",
    "                    break\n",
    "                # 移除填充符\n",
    "                if remove_pad and word == \"ruptedException\":\n",
    "                    break\n",
    "                # 添加单词到文本列表\n",
    "                text.append(word)\n",
    "            # 合并单词列表为句子\n",
    "            text_list.append(\" \".join(text) if not split else text)\n",
    "        return text_list"
   ],
   "id": "f3d953bf4b924bd2",
   "outputs": [],
   "execution_count": 16
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T02:29:23.921175Z",
     "start_time": "2025-03-05T02:29:23.914671Z"
    }
   },
   "cell_type": "code",
   "source": [
    "#测试Tokenizer\n",
    "tokenizer = Tokenizer(word2idx=word2idx, idx2word=idx2word)\n",
    "raw_text = [\"hello world\".split(), \"tokenize text datas with batch\".split(), \"this is a test\".split()]\n",
    "indices = tokenizer.encode(raw_text)  #encode支持批量处理\n",
    "print(\"raw text\")\n",
    "for raw in raw_text:\n",
    "    print(raw)\n",
    "print(\"indices\")\n",
    "for index in indices:\n",
    "    print(index)"
   ],
   "id": "fcf84f5acdf7c97b",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "raw text\n",
      "['hello', 'world']\n",
      "['tokenize', 'text', 'datas', 'with', 'batch']\n",
      "['this', 'is', 'a', 'test']\n",
      "indices\n",
      "tensor([   1, 4825,  182,    3,    0,    0,    0])\n",
      "tensor([    1,     2,  3004,     2,    19, 19233,     3])\n",
      "tensor([   1,   14,    9,    6, 2181,    3,    0])\n"
     ]
    }
   ],
   "execution_count": 17
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T02:29:58.116347Z",
     "start_time": "2025-03-05T02:29:58.112912Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 解码,保留特殊符号\n",
    "decode_text = tokenizer.decode(indices.tolist(), remove_bos=False, remove_eos=False, remove_pad=False)\n",
    "print(\"decode text----------\")\n",
    "for decode in decode_text:\n",
    "    print(decode)"
   ],
   "id": "e777e09f34c5f527",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "decode text----------\n",
      "[BOS] hello world [EOS] [PAD] [PAD] [PAD]\n",
      "[BOS] [UNK] text [UNK] with batch [EOS]\n",
      "[BOS] this is a test [EOS] [PAD]\n"
     ]
    }
   ],
   "execution_count": 18
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T02:30:32.091997Z",
     "start_time": "2025-03-05T02:30:32.087507Z"
    }
   },
   "cell_type": "code",
   "source": "tokenizer.decode(train_data[0:1], remove_bos=False, remove_eos=False, remove_pad=False)",
   "id": "93417feadf28a16f",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[\"[BOS] this film was just brilliant casting location scenery story direction everyone's really suited the part they played and you could just imagine being there robert [UNK] is an amazing actor and now the same being director [UNK] father came from the same scottish island as myself so i loved the fact there was a real connection with this film the witty remarks throughout the film were great it was just brilliant so much that i bought the film as soon as it was released for [UNK] and would recommend it to everyone to watch and the fly fishing was amazing really cried at the end it was so sad and you know what they say if you cry at a film it must have been good and this definitely was also [UNK] to the two little boy's that played the [UNK] of norman and paul they were just brilliant children are often left out of the [UNK] list i think because the stars that play them all grown up are such a big profile for the whole film but these children are amazing and should be praised for what they have done don't you think the whole story was so lovely because it was true and was someone's life after all that was shared with us all\"]"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 20
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "# 数据集与 DataLoader",
   "id": "f6164a0bd3f0e613"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T02:46:13.016362Z",
     "start_time": "2025-03-05T02:46:12.106061Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from torch.utils.data import Dataset, DataLoader\n",
    "\n",
    "\n",
    "class IMDBDataset(Dataset):\n",
    "    def __init__(self, data, labels, remain_length=True):\n",
    "        if remain_length:  #字符串输出样本中，是否含有【BOS】和【EOS】，【PAD】\n",
    "            self.data = tokenizer.decode(data, remove_bos=False, remove_eos=False, remove_pad=False)\n",
    "        else:\n",
    "            # 去除【BOS】和【EOS】，【PAD】\n",
    "            self.data = tokenizer.decode(data)\n",
    "        self.labels = labels\n",
    "\n",
    "    def __getitem__(self, index):\n",
    "        text = self.data[index]\n",
    "        label = self.labels[index]\n",
    "        return text, label\n",
    "\n",
    "    def __len__(self):\n",
    "        return len(self.data)\n",
    "\n",
    "\n",
    "def collate_fct(batch):\n",
    "    \"\"\"\n",
    "    将batch数据处理成tensor形式\n",
    "    :param batch:\n",
    "    :return:\n",
    "    \"\"\"\n",
    "    # 文本列表，批次中每个样本的文本分词[[],[],[]]\n",
    "    text_list = [item[0].split() for item in batch]\n",
    "    # 标签列表\n",
    "    label_list = [item[1] for item in batch]\n",
    "    # 文本列表转化为索引列表\n",
    "    text_list = tokenizer.encode(text_list).to(dtype=torch.int)\n",
    "\n",
    "    # 标签列表转化为tensor,reshape(-1,1)是为了适配线性层的输入\n",
    "    return text_list, torch.tensor(label_list).reshape(-1, 1).to(dtype=torch.float)\n",
    "\n",
    "\n",
    "train_ds = IMDBDataset(train_data, train_labels)\n",
    "test_ds = IMDBDataset(test_data, test_labels)"
   ],
   "id": "fe50c4f89d86a074",
   "outputs": [],
   "execution_count": 21
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T02:46:37.142041Z",
     "start_time": "2025-03-05T02:46:37.137439Z"
    }
   },
   "cell_type": "code",
   "source": [
    "batch_size = 128\n",
    "train_dl = DataLoader(train_ds, batch_size=batch_size, shuffle=True, collate_fn=collate_fct)  #collate_fn是处理batch的函数\n",
    "test_dl = DataLoader(test_ds, batch_size=batch_size, shuffle=False, collate_fn=collate_fct)"
   ],
   "id": "9095f13266a14ca1",
   "outputs": [],
   "execution_count": 22
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "# 模型定义",
   "id": "4429087f795cd89c"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T03:15:40.783428Z",
     "start_time": "2025-03-05T03:15:40.775501Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 用于构建一个处理序列数据的神经网络模型\n",
    "class AddingModel(nn.Module):\n",
    "    def __init__(self, embedding_dim=16, hidden_dim=64, vocab_size=vocab_size):\n",
    "        \"\"\"\n",
    "        初始化模型\n",
    "        :param embedding_dim: 词嵌入维度\n",
    "        :param hidden_dim: 隐藏层维度\n",
    "        :param vocab_size: 词表大小\n",
    "        \"\"\"\n",
    "        super(AddingModel, self).__init__()\n",
    "\n",
    "        # 定义一个词嵌入层，将输入的整数索引（如单词ID）映射为固定维度的向量\n",
    "        # 将离散的单词ID转换为连续的向量表示\n",
    "        self.embedding = nn.Embedding(vocab_size, embedding_dim)\n",
    "\n",
    "        # 定义一个自适应平均池化层，将输入序列的长度压缩为1,减少序列长度，提取全局信息\n",
    "        self.pool = nn.AdaptiveAvgPool1d(1)\n",
    "\n",
    "        # 定义两个全连接层：\n",
    "        # self.layer：将词嵌入维度映射到隐藏层维度。\n",
    "        # self.fc：将隐藏层维度映射到输出维度（1）\n",
    "        self.layer = nn.Linear(embedding_dim, hidden_dim)\n",
    "        self.fc = nn.Linear(hidden_dim, 1)\n",
    "\n",
    "    def forward(self, x):\n",
    "        x = self.embeding(x)  # [bs, seq length] [128, 500]  [128,500,10000]--->[128,500,16]\n",
    "\n",
    "        # 调整张量的维度顺序，从 (batch_size, seq_len, embedding_dim) 变为 (batch_size, embedding_dim, seq_len)\n",
    "        # 将词嵌入维度放在中间，方便池化操作.nn.AdaptiveAvgPool1d 需要在最后一个维度上进行池化\n",
    "        x = x.permute(0, 2, 1)  # 尺寸[128,500,16]--》[128,16,500]\n",
    "\n",
    "        # 对序列数据进行全局平均池化，将序列长度压缩为1\n",
    "        x = self.pool(x)\n",
    "\n",
    "        # 去除池化后的多余维度（长度为1的维度）,将张量从 (batch_size, embedding_dim, 1) 变为 (batch_size, embedding_dim)\n",
    "        # 方便后续全连接层的输入\n",
    "        x = x.squeeze(2)\n",
    "        x = self.layer(x)  # 将池化后的特征通过第一个全连接层，映射到隐藏层维度\n",
    "        x = self.fc(x)  # 将隐藏层特征通过第二个全连接层，映射到输出维度（1）\n",
    "        return x\n",
    "\n",
    "\n",
    "for key, value in AddingModel().named_parameters():\n",
    "    print(f\"{key:^40}paramerters num: {np.prod(value.shape)}\")"
   ],
   "id": "9284f7a6f4f56ba9",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "            embeding.weight             paramerters num: 160000\n",
      "              layer.weight              paramerters num: 1024\n",
      "               layer.bias               paramerters num: 64\n",
      "               fc.weight                paramerters num: 64\n",
      "                fc.bias                 paramerters num: 1\n"
     ]
    }
   ],
   "execution_count": 23
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "# 模型训练",
   "id": "7911d4e4a32b548d"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T03:16:00.314963Z",
     "start_time": "2025-03-05T03:16:00.274016Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from sklearn.metrics import accuracy_score\n",
    "\n",
    "\n",
    "@torch.no_grad()\n",
    "def evaluating(model, dataloader, loss_fct):\n",
    "    loss_list = []\n",
    "    pred_list = []\n",
    "    label_list = []\n",
    "    for datas, labels in dataloader:\n",
    "        datas = datas.to(device)\n",
    "        labels = labels.to(device)\n",
    "        # 前向计算\n",
    "        logits = model(datas)\n",
    "        loss = loss_fct(logits, labels)  # 验证集损失\n",
    "        loss_list.append(loss.item())\n",
    "        # 二分类\n",
    "        preds = logits > 0\n",
    "        pred_list.extend(preds.cpu().numpy().tolist())\n",
    "        label_list.extend(labels.cpu().numpy().tolist())\n",
    "\n",
    "    acc = accuracy_score(label_list, pred_list)\n",
    "    return np.mean(loss_list), acc\n"
   ],
   "id": "d77725e846efbf15",
   "outputs": [],
   "execution_count": 24
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T03:16:05.015908Z",
     "start_time": "2025-03-05T03:16:04.897838Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from torch.utils.tensorboard import SummaryWriter\n",
    "\n",
    "\n",
    "class TensorBoardCallback:\n",
    "    def __init__(self, log_dir, flush_secs=10):\n",
    "        \"\"\"\n",
    "        Args:\n",
    "            log_dir (str): dir to write log.\n",
    "            flush_secs (int, optional): write to dsk each flush_secs seconds. Defaults to 10.\n",
    "        \"\"\"\n",
    "        self.writer = SummaryWriter(log_dir=log_dir, flush_secs=flush_secs)\n",
    "\n",
    "    def draw_model(self, model, input_shape):\n",
    "        self.writer.add_graph(model, input_to_model=torch.randn(input_shape))\n",
    "\n",
    "    def add_loss_scalars(self, step, loss, val_loss):\n",
    "        self.writer.add_scalars(\n",
    "            main_tag=\"training/loss\",\n",
    "            tag_scalar_dict={\"loss\": loss, \"val_loss\": val_loss},\n",
    "            global_step=step,\n",
    "        )\n",
    "\n",
    "    def add_acc_scalars(self, step, acc, val_acc):\n",
    "        self.writer.add_scalars(\n",
    "            main_tag=\"training/accuracy\",\n",
    "            tag_scalar_dict={\"accuracy\": acc, \"val_accuracy\": val_acc},\n",
    "            global_step=step,\n",
    "        )\n",
    "\n",
    "    def add_lr_scalars(self, step, learning_rate):\n",
    "        self.writer.add_scalars(\n",
    "            main_tag=\"training/learning_rate\",\n",
    "            tag_scalar_dict={\"learning_rate\": learning_rate},\n",
    "            global_step=step,\n",
    "\n",
    "        )\n",
    "\n",
    "    def __call__(self, step, **kwargs):\n",
    "        # add loss\n",
    "        loss = kwargs.pop(\"loss\", None)\n",
    "        val_loss = kwargs.pop(\"val_loss\", None)\n",
    "        if loss is not None and val_loss is not None:\n",
    "            self.add_loss_scalars(step, loss, val_loss)\n",
    "        # add acc\n",
    "        acc = kwargs.pop(\"acc\", None)\n",
    "        val_acc = kwargs.pop(\"val_acc\", None)\n",
    "        if acc is not None and val_acc is not None:\n",
    "            self.add_acc_scalars(step, acc, val_acc)\n",
    "        # add lr\n",
    "        learning_rate = kwargs.pop(\"lr\", None)\n",
    "        if learning_rate is not None:\n",
    "            self.add_lr_scalars(step, learning_rate)\n"
   ],
   "id": "d06b49f14c7c31e",
   "outputs": [],
   "execution_count": 25
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T03:16:09.853088Z",
     "start_time": "2025-03-05T03:16:09.848778Z"
    }
   },
   "cell_type": "code",
   "source": [
    "class SaveCheckpointsCallback:\n",
    "    def __init__(self, save_dir, save_step=5000, save_best_only=True):\n",
    "        \"\"\"\n",
    "        Save checkpoints each save_epoch epoch. \n",
    "        We save checkpoint by epoch in this implementation.\n",
    "        Usually, training scripts with pytorch evaluating model and save checkpoint by step.\n",
    "\n",
    "        Args:\n",
    "            save_dir (str): dir to save checkpoint\n",
    "            save_epoch (int, optional): the frequency to save checkpoint. Defaults to 1.\n",
    "            save_best_only (bool, optional): If True, only save the best model or save each model at every epoch.\n",
    "        \"\"\"\n",
    "        self.save_dir = save_dir\n",
    "        self.save_step = save_step\n",
    "        self.save_best_only = save_best_only\n",
    "        self.best_metrics = -1\n",
    "\n",
    "        # mkdir\n",
    "        if not os.path.exists(self.save_dir):\n",
    "            os.mkdir(self.save_dir)\n",
    "\n",
    "    def __call__(self, step, state_dict, metric=None):\n",
    "        if step % self.save_step > 0:\n",
    "            return\n",
    "\n",
    "        if self.save_best_only:\n",
    "            assert metric is not None\n",
    "            if metric >= self.best_metrics:\n",
    "                # save checkpoints\n",
    "                torch.save(state_dict, os.path.join(self.save_dir, \"best.ckpt\"))\n",
    "                # update best metrics\n",
    "                self.best_metrics = metric\n",
    "        else:\n",
    "            torch.save(state_dict, os.path.join(self.save_dir, f\"{step}.ckpt\"))\n",
    "\n"
   ],
   "id": "615d3870addccef5",
   "outputs": [],
   "execution_count": 26
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T03:16:14.109246Z",
     "start_time": "2025-03-05T03:16:14.105025Z"
    }
   },
   "cell_type": "code",
   "source": [
    "class EarlyStopCallback:\n",
    "    def __init__(self, patience=5, min_delta=0.01):\n",
    "        \"\"\"\n",
    "\n",
    "        Args:\n",
    "            patience (int, optional): Number of epochs with no improvement after which training will be stopped.. Defaults to 5.\n",
    "            min_delta (float, optional): Minimum change in the monitored quantity to qualify as an improvement, i.e. an absolute \n",
    "                change of less than min_delta, will count as no improvement. Defaults to 0.01.\n",
    "        \"\"\"\n",
    "        self.patience = patience\n",
    "        self.min_delta = min_delta\n",
    "        self.best_metric = -1\n",
    "        self.counter = 0\n",
    "\n",
    "    def __call__(self, metric):\n",
    "        if metric >= self.best_metric + self.min_delta:\n",
    "            # update best metric\n",
    "            self.best_metric = metric\n",
    "            # reset counter \n",
    "            self.counter = 0\n",
    "        else:\n",
    "            self.counter += 1\n",
    "\n",
    "    @property\n",
    "    def early_stop(self):\n",
    "        return self.counter >= self.patience\n"
   ],
   "id": "ff5ef93f74ebce3",
   "outputs": [],
   "execution_count": 27
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T03:26:30.564373Z",
     "start_time": "2025-03-05T03:26:30.559333Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 训练\n",
    "def training(\n",
    "        model,\n",
    "        train_loader,\n",
    "        val_loader,\n",
    "        epoch,\n",
    "        loss_fct,\n",
    "        optimizer,\n",
    "        tensorboard_callback=None,\n",
    "        save_ckpt_callback=None,\n",
    "        early_stop_callback=None,\n",
    "        eval_step=500,\n",
    "):\n",
    "    record_dict = {\n",
    "        \"train\": [],\n",
    "        \"val\": []\n",
    "    }\n",
    "\n",
    "    global_step = 0\n",
    "    model.train()\n",
    "    with tqdm(total=epoch * len(train_loader)) as pbar:\n",
    "        for epoch_id in range(epoch):\n",
    "            # training\n",
    "            for datas, labels in train_loader:\n",
    "                datas = datas.to(device)\n",
    "                labels = labels.to(device)\n",
    "                # 梯度清空\n",
    "                optimizer.zero_grad()\n",
    "                # 模型前向计算\n",
    "                logits = model(datas)\n",
    "                # 计算损失\n",
    "                loss = loss_fct(logits, labels)\n",
    "                # 梯度回传\n",
    "                loss.backward()\n",
    "                # 调整优化器，包括学习率的变动等\n",
    "                optimizer.step()\n",
    "                preds = logits > 0  #当sigmoid输出大于0.5时，预测为1，否则预测为0，这里大于0，刚好sigmoid的值是0.5，预测为1\n",
    "\n",
    "                acc = accuracy_score(labels.cpu().numpy(), preds.cpu().numpy())\n",
    "                loss = loss.cpu().item()\n",
    "                # record\n",
    "\n",
    "                record_dict[\"train\"].append({\n",
    "                    \"loss\": loss, \"acc\": acc, \"step\": global_step\n",
    "                })\n",
    "\n",
    "                # evaluating\n",
    "                if global_step % eval_step == 0:\n",
    "                    model.eval()\n",
    "                    val_loss, val_acc = evaluating(model, val_loader, loss_fct)\n",
    "                    record_dict[\"val\"].append({\n",
    "                        \"loss\": val_loss, \"acc\": val_acc, \"step\": global_step\n",
    "                    })\n",
    "                    model.train()\n",
    "\n",
    "                    # 1. 使用 tensorboard 可视化\n",
    "                    if tensorboard_callback is not None:\n",
    "                        tensorboard_callback(\n",
    "                            global_step,\n",
    "                            loss=loss, val_loss=val_loss,\n",
    "                            acc=acc, val_acc=val_acc,\n",
    "                            lr=optimizer.param_groups[0][\"lr\"],\n",
    "                        )\n",
    "\n",
    "                    # 2. 保存模型权重 save model checkpoint\n",
    "                    if save_ckpt_callback is not None:\n",
    "                        save_ckpt_callback(global_step, model.state_dict(), metric=val_acc)\n",
    "\n",
    "                    # 3. 早停 Early Stop\n",
    "                    if early_stop_callback is not None:\n",
    "                        early_stop_callback(val_acc)\n",
    "                        if early_stop_callback.early_stop:\n",
    "                            print(f\"Early stop at epoch {epoch_id} / global_step {global_step}\")\n",
    "                            return record_dict\n",
    "\n",
    "                # udate step\n",
    "                global_step += 1\n",
    "                pbar.update(1)\n",
    "                pbar.set_postfix({\"epoch\": epoch_id})\n",
    "\n",
    "    return record_dict"
   ],
   "id": "7b1259e79c27301b",
   "outputs": [],
   "execution_count": 28
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T03:30:42.491760Z",
     "start_time": "2025-03-05T03:27:01.588566Z"
    }
   },
   "cell_type": "code",
   "source": [
    "epoch = 20\n",
    "\n",
    "model = AddingModel()\n",
    "\n",
    "# 1. 定义损失函数 采用二进制交叉熵损失, 先sigmoid再计算交叉熵\n",
    "loss_fct = F.binary_cross_entropy_with_logits\n",
    "# loss_fct =nn.BCEWithLogitsLoss()\n",
    "# 2. 定义优化器 采用 adam\n",
    "# Optimizers specified in the torch.optim package\n",
    "optimizer = torch.optim.Adam(model.parameters(), lr=0.001)\n",
    "\n",
    "# 1. tensorboard 可视化\n",
    "if not os.path.exists(\"runs\"):\n",
    "    os.mkdir(\"runs\")\n",
    "tensorboard_callback = TensorBoardCallback(\"runs/imdb-adding\")\n",
    "# tensorboard_callback.draw_model(model, [1, MAX_LENGTH])\n",
    "# 2. save best\n",
    "if not os.path.exists(\"checkpoints\"):\n",
    "    os.makedirs(\"checkpoints\")\n",
    "save_ckpt_callback = SaveCheckpointsCallback(\"checkpoints/imdb-adding\", save_step=len(train_dl), save_best_only=True)\n",
    "# 3. early stop\n",
    "early_stop_callback = EarlyStopCallback(patience=5)\n",
    "\n",
    "model = model.to(device)\n",
    "record = training(\n",
    "    model,\n",
    "    train_dl,\n",
    "    test_dl,\n",
    "    epoch,\n",
    "    loss_fct,\n",
    "    optimizer,\n",
    "    tensorboard_callback=None,\n",
    "    save_ckpt_callback=save_ckpt_callback,\n",
    "    early_stop_callback=early_stop_callback,\n",
    "    eval_step=len(train_dl)\n",
    ")"
   ],
   "id": "5cce8adae4d3f57e",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "  0%|          | 0/3920 [00:00<?, ?it/s]"
      ],
      "application/vnd.jupyter.widget-view+json": {
       "version_major": 2,
       "version_minor": 0,
       "model_id": "875012960d5643adbb10c1380c2d076b"
      }
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Early stop at epoch 15 / global_step 2940\n"
     ]
    }
   ],
   "execution_count": 29
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T03:30:43.104700Z",
     "start_time": "2025-03-05T03:30:42.500777Z"
    }
   },
   "cell_type": "code",
   "source": [
    "#画线要注意的是损失是不一定在零到1之间的\n",
    "def plot_learning_curves(record_dict, sample_step=500):\n",
    "    # build DataFrame\n",
    "    train_df = pd.DataFrame(record_dict[\"train\"]).set_index(\"step\").iloc[::sample_step]\n",
    "    val_df = pd.DataFrame(record_dict[\"val\"]).set_index(\"step\")\n",
    "\n",
    "    # plot\n",
    "    fig_num = len(train_df.columns)\n",
    "    fig, axs = plt.subplots(1, fig_num, figsize=(5 * fig_num, 5))\n",
    "    for idx, item in enumerate(train_df.columns):\n",
    "        axs[idx].plot(train_df.index, train_df[item], label=f\"train_{item}\")\n",
    "        axs[idx].plot(val_df.index, val_df[item], label=f\"val_{item}\")\n",
    "        axs[idx].grid()\n",
    "        axs[idx].legend()\n",
    "        # axs[idx].set_xticks(range(0, train_df.index[-1], 5000))\n",
    "        # axs[idx].set_xticklabels(map(lambda x: f\"{int(x/1000)}k\", range(0, train_df.index[-1], 5000)))\n",
    "        axs[idx].set_xlabel(\"step\")\n",
    "\n",
    "    plt.show()\n",
    "\n",
    "\n",
    "plot_learning_curves(record, sample_step=10)  #横坐标是 steps"
   ],
   "id": "a4f44dc73da98b23",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 1000x500 with 2 Axes>"
      ],
      "image/png": "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2LFjbf/73/9s33zzjS0rK8v24IMPNvtYeN0PP/yw7ZNPPmFnQtunn36qef7pp5+2paam2j777DPbhg0bbBdccIGtS5cutoqKCucy55xzjm3AgAG2lStX2n788Udbt27dbFOmTHE+f/z4cVvbtm1tU6dOtf3222+2//73v7aEhATb3//+9xYb17Rp08R2q9/hsWPHNMsE47gmTJhge+utt8T61q9fb5s0aZKtY8eOttLS0kbd/3bt2mVLTEy03XXXXbbNmzfbXnnlFVtUVJRt/vz5LTq2M844Qxwj1O+Nv4dgHtsXX3xh+/rrr23bt2+3bdu2zfbQQw/ZYmJixDhD+fuyOjg3tdy5yarnJV/GhnNTcB3rrHpeCrVzk6WF0LBhw2x33HGH835dXZ2tffv2tqeeesoWzCcbPggZUVxcLHakDz/80PnYli1bxAFvxYoV4j7vLJGRkbbDhw87l3nttddsKSkptqqqKltLoT8o19fX27Kzs23PPvusZnxxcXHiwMrwjs2v++WXX5zLfPvtt7aIiAjbgQMHxP1XX33Vlp6erhnb/fffb+vZs2eLjEuebC688ELT14TCuJiCggKxncuWLWvU/e++++4TEyqVK664QpwUWmps8oTzpz/9yfQ1oTI23m/efPNNS31fVgPnpuA4N1n1vMTg3BR6xzorn5eC+dxk2dS46upqWrt2rQhrSyIjI8X9FStWUDDDYXgObXft2lWEqDk8yPB4ampqNGPi1ISOHTs6x8T/9+vXj9q2betcZsKECXTixAnatGkTBQu7d++mw4cPa8aSmpoqUkTUsXBofujQoc5leHn+HletWuVcZvTo0RQbG6sZL4eXi4qKqKXgcC2Hcnv27Em33XYbHT161PlcqIzr+PHj4v+MjIxG3f94GfU95DLN+bvUj03y7rvvUlZWFp188sn04IMPUnl5ufO5YB9bXV0dvf/++1RWVibSEKz0fVkJnJuC99xk9fMSg3NT8B7rrHheCoVzUzRZlCNHjogPX/0QGb6/detWClb4gMs5jnyQOnToEM2cOVPk4v7222/iAM0HHz5Q6cfEzzH8v9GY5XPBgtwWo21Vx8IHbJXo6GhxkFCX6dKli9t7yOfS09OpueGc60suuURs186dO+mhhx6iiRMnih9nVFRUSIyrvr6e7rzzTjrttNPEwVeutzH2P7Nl+ABXUVEh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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 30
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "# 评估",
   "id": "a7276e4af79763f8"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T03:30:51.105418Z",
     "start_time": "2025-03-05T03:30:43.109388Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# dataload for evaluating\n",
    "\n",
    "# load checkpoints\n",
    "model.load_state_dict(torch.load(\"checkpoints/imdb-adding/best.ckpt\", weights_only=True, map_location=\"cpu\"))\n",
    "\n",
    "model.eval()\n",
    "loss, acc = evaluating(model, test_dl, loss_fct)\n",
    "print(f\"loss:     {loss:.4f}\\naccuracy: {acc:.4f}\")"
   ],
   "id": "ca316669b4a632f1",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss:     0.3175\n",
      "accuracy: 0.8777\n"
     ]
    }
   ],
   "execution_count": 31
  },
  {
   "metadata": {},
   "cell_type": "code",
   "outputs": [],
   "execution_count": null,
   "source": "",
   "id": "e00cebe0c9a95744"
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
